package v1

import (
	"fmt"
	"math"
	"time"
	"xjxtld/internal/dao"

	"github.com/gogf/gf/v2/container/gvar"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gctx"
	"github.com/gogf/gf/v2/os/gtime"
	"github.com/gogf/gf/v2/os/gtimer"
	"github.com/gogf/gf/v2/util/gutil"
	"golang.org/x/net/context"
)

const getxjMessage = "车辆，组织已从ERP系统更新至MYSQL数据库"

type Mcorginfogs struct {
	ORGID                 string //
	ORGNAME               string //
	ORGTYPE               string //
	PARENTORGID           string //
	ADDRESS               string //
	TELEPHONE             string //
	POST                  string //
	FAX                   string //
	ISACTIVE              string //
	MEMOS                 string //
	ORGTNAME              string //
	CREATED               string //
	CREATEBY              string //
	UPDATED               string //
	UPDATEBY              string //
	ISOPERATIONUNIT       string //
	ISMAINTAINUNIT        string //
	ISSTOCKUNIT           string //
	ORGCODE               string //
	ISADMINUNIT           string //
	FLAG                  string //
	VERNUM                string //
	ISOPERATIONSUBCOMPANY string //
	RETAIN1               string //
	RETAIN2               string //
	RETAIN3               string //
	RETAIN4               string //
	RETAIN5               string //
	RETAIN6               string //
	RETAIN7               string //
	RETAIN8               string //
	RETAIN9               string //
	RETAIN10              string //
	ORGPROPERTY           string //
	SORTINDEX             string //
}

type Mcbusinfogs struct {
	BUSID                    string //
	ORGID                    string //
	CARDID                   string //
	BUSSELFID                string //
	BUYDATE                  string //
	USEDATE                  string //
	BUSTID                   string //
	CHASSISNO                string //
	CERTIFICATEDATE          string //
	BUSSID                   string //
	SUMMILE                  string //
	SUMTIME                  string //
	LSTDATE                  string //
	FLAG                     string //
	MEMOS                    string //
	CHECKTYPE                string //
	BUSTYPE                  string //
	BUSSTRUCTURE             string //
	ISAIR                    string //
	CREATED                  string //
	CREATEBY                 string //
	UPDATED                  string //
	UPDATEBY                 string //
	ISACTIVE                 string //
	USENATURE                string //
	CATEGORY                 string //
	ENGINEID                 string //
	COMPRESSORNO             string //
	BATTERYCOUNT             string //
	COUNTRYFLG               string //
	OPERATIONSNO             string //
	RESPONSIBLE              string //
	ORIGINDATA               string //
	ORIGINNO                 string //
	SUPPLIER                 string //
	IMPORTCERTIFICATE        string //
	IMPORTCERTIFICATENO      string //
	WARRANTYDATE             string //
	DUTYPAIDCERTIFICATE      string //
	DUTYPAIDCERTIFICATENO    string //
	REPAIRDEMAND             string //
	REGISTNO                 string //
	BUYPRICE                 string //
	PRODUCEDATE              string //
	REGISTERDATE             string //
	INTODATE                 string //
	ANNUALDATE               string //
	VALIDITY                 string //
	USELIFE                  string //
	GETKIND                  string //
	IMGPATH                  string //
	STARTMILE                string //
	OUTERCOLOR               string //
	STATUS                   string //
	RETAIN1                  string //
	RETAIN2                  string //
	RETAIN3                  string //
	RETAIN4                  string //
	RETAIN5                  string //
	RETAIN6                  string //
	RETAIN7                  string //
	RETAIN8                  string //
	RETAIN9                  string //
	RETAIN10                 string //
	MANUFACTORY              string //
	MOTORTYPE                string //
	OILTYPE                  string //
	OILTNAME                 string //
	PASSENGERS               string //
	POWER                    string //
	TRANSMISSION             string //
	TIRETYPE                 string //
	TORSIONAL                string //
	STDBUSNUM                string //
	VOLUME                   string //
	VOLUMESTAND              string //
	BOXTYPE                  string //
	AIRCONDITIONTYPE         string //
	ALLOWPASSENGERS          string //
	MASS                     string //
	MAXMASS                  string //
	DIMENSION                string //
	BUSSELFTYPE              string //
	STEERINGKIND             string //
	APPROVEDWEIGHT           string //
	TRACTIONWEIGHT           string //
	CHASSIS                  string //
	CHASSISINFO              string //
	BRANDMODEL               string //
	SEATCOUNT                string //
	CABPASSENGER             string //
	TIRECOUNT                string //
	CARGOSIZE                string //
	SHRAPNALCOUNT            string //
	AXES                     string //
	WHEELBASE                string //
	TRACKBEFORE              string //
	TRACKBEHIND              string //
	SUSPENSION               string //
	RETARDER                 string //
	CLUTCH                   string //
	BRAKINGMODE              string //
	BRAKES                   string //
	BRAKEADJUSTING           string //
	TRAVERSINGMECHANISM      string //
	CENTRALIZEDLUBRICATION   string //
	CARHEATER                string //
	CANBUS                   string //
	DRIVINGSHAFT             string //
	VERNUM                   string //
	INITIALIZEDATE           string //
	OILBOXVOLUME             string //
	PURCHASETAX              string //
	LICENSEFEE               string //
	ISRETARDER               string //
	ORDERSTATUS              string //
	BUSHISSTATUS             string //
	CANFLAG                  string //
	SELFOWN                  string //
	POSNO                    string //
	PRODUCTSERIAL            string //
	DVRSERIAL                string //
	OLDENGINETYPE            string //
	OLDTIRETYPE              string //
	OLDENGINENO              string //
	BUSOWNER                 string //
	ISINSTALLOILLMEASUREMENT string //
	GASKIND                  string //
	FUELUSERUPSTANDARDID     string //
	FUELCOSTOFFSET           string //
	STARTSYMBOL              string //
	ISPUSHED                 string //
	BUSCUSTOMTYPE            string //
	BUSONCECARDID            string //
	MONTHLYDEPRECIATION      string //
	RESIDUALTOTAL            string //
	TOTAL                    string //
	INSTALLDATE              string //
	PRODUCTIONDATE           string //
	INSTRUCTIONPATH          string //
	REGISTRATIONPATH         string //
	DRIVINGLICENSEPATH       string //
	BUSIMAGEPATH             string //
	ROUTEIDFORBPM            string //
	ISLOVEBUS                string //
	REPAIRWORKSHOP           string //
	PARKINGSPACE             string //
	CANMODEL                 string //
	SILVERYBOXTYPE           string //
	BUSBRAND                 string //
	ENGINETYPE               string //
	ISTWOGROUND              string //
	JQXSTARTDATE             string //
	CYRZRXSTARTDATE          string //
	OFFWRITEDATE             string //
	FORCEOFFDATE             string //
	BUYINVOICENO             string //
	UNMAINTAINKM             string //
	ISTROLLEYBUS             string //
	MINIMUNTROLLEYRATE       string //
	USECHARACTER             string //
	ISSRT                    string //
}

type Xjtcp struct {
	Id               string
	Bus_plate        string
	Exec_date        string
	Main_route_name  string
	Staff_name       string
	Staff_worknum    string
	Main_bus_self_no string
}

type Fdbus struct {
	Displanid      string //
	Cardid         string //
	Rundate        string //这个地方转时间戳
	Routename      string //
	Userid         string //
	Driver         string //
	Org            string //
	Orgname        string //
	Numbercode     string //
	PlanStartTime  string //转时间戳
	PlanArriveTime string //转时间戳
	RealStartTime  string //转时间戳
	RealArriveTime string //转时间戳
	WorkStatus     string //是否排班
	Nid            string //拼接字符串
}

type Allfdbus struct {
	Displanid      string `json:"displanid"      orm:"displanid"        ` //
	Cardid         string `json:"cardid"         orm:"cardid"           ` //
	Rundate        string `json:"rundate"        orm:"rundate"          ` //
	Routename      string `json:"routename"      orm:"routename"        ` //
	Userid         string `json:"userid"         orm:"userid"           ` //
	Driver         string `json:"driver"         orm:"driver"           ` //
	Org            string `json:"org"            orm:"org"              ` //
	Orgname        string `json:"orgname"        orm:"orgname"          ` //
	Numbercode     string `json:"numbercode"     orm:"numbercode"       ` //
	PlanStartTime  string `json:"planStartTime"  orm:"plan_start_time"  ` //
	PlanArriveTime string `json:"planArriveTime" orm:"plan_arrive_time" ` //
	RealStartTime  string `json:"realStartTime"  orm:"real_start_time"  ` //
	RealArriveTime string `json:"realArriveTime" orm:"real_arrive_time" ` //
	WorkStatus     string //是否排班
	Nid            string //拼接字符串
}

type TimeSet interface {
	RundateSet(now string) *Fdbus
	PlanStartTimeSet(now string)
	PlanArriveTimeSet(now string)
	RealStartTimeSet(now string)
	RealArriveTimeSet(now string)
	NidSet(now string)
	WorkStatusSet(now string)
}

type UpdateSave struct{}

type Scheduling interface { //更新排班
	Operations()    //已排班
	NotOperations() //未排班
}

func PlanArriveTime() {
	var (
		ctx      = gctx.New()
		interval = time.Second
	)

	gtimer.AddSingleton(ctx, interval*120, func(ctx context.Context) {
		sql, _ := g.DB().Model("view_lastbusplan").All()
		g.DB().Model("fa_busarrivetime").Save(gvar.New(sql).Maps())
	})
	select {}
}

func (t *Fdbus) RundateSet(now string) *Fdbus {
	if now == "" {
		now = gtime.Now().Format("Y-m-d")
		t.Rundate = gvar.New(gtime.New(now).Timestamp() + 7200).String()
	} else {
		t.Rundate = gvar.New(gtime.New(now).Timestamp() + 7200).String()
	}
	return t
	//gutil.Dump(t)
}

func (t *Fdbus) PlanStartTimeSet(now string) {
	t.PlanStartTime = gvar.New(gtime.New(now).Timestamp()).String()
}

func (t *Fdbus) PlanArriveTimeSet(now string) {
	t.PlanArriveTime = gvar.New(gtime.New(now).Timestamp()).String()
}

func (t *Fdbus) RealStartTimeSet(now string) {
	t.RealStartTime = gvar.New(gtime.New(now).Timestamp()).String()
}

func (t *Fdbus) RealArriveTimeSet(now string) {
	t.RealArriveTime = gvar.New(gtime.New(now).Timestamp()).String()
}

func (t *Fdbus) NidSet(now string) {
	if now == "" {
		now = gtime.Now().Format("Y-m-d")
		t.Nid = t.Numbercode + gvar.New(gtime.New(now).Timestamp()+7200).String()
		t.Displanid = "not"
	} else {
		t.Nid = t.Numbercode + gvar.New(gtime.New(now).Timestamp()+7200).String()
	}
}

func (t *Fdbus) WorkStatusSet(now string) {
	t.WorkStatus = now
}

func BusAndOrg() {
	var org []*Mcorginfogs
	var bus []*Mcbusinfogs
	var dataPill any
	_ = g.DB("apts").Model("Mcbusinfogs").Scan(&bus)
	_ = g.DB("apts").Model("mcorginfogs").Scan(&org)
	busDaoRu := gvar.New(bus).Maps()
	busCount := len(bus)
	if busCount > 100 {
		num := 100 //每次导入条数
		limit := math.Ceil(float64(busCount) / float64(num))
		for i := 1; i <= int(limit); i++ {
			offset := (i - 1) * num
			if num*(i+1) > busCount {
				dataPill = busDaoRu[offset:]
			} else {
				dataPill = busDaoRu[offset : num*(i+1)]
			}
			//gutil.Dump(dataPill)
			g.DB().Model("fa_Mcbusinfogs").Data(dataPill).Save()
		}
	} else {
		g.DB().Model("fa_Mcbusinfogs").Data(bus).Save()
	}
	_, _ = g.DB().Model("fa_Mcorginfogs").Data(org).Save()
	fmt.Println(getxjMessage)
	return
}

func UpDateXjxt() {
	Scheduling.Operations(&UpdateSave{})    //已排班的
	Scheduling.NotOperations(&UpdateSave{}) //未排班的
}

//func ExchangeBus(){
//
//}

func (t *UpdateSave) Operations() {
	var fdbus []Fdbus
	var dataPill any
	ctx := gctx.New()

	// 直接使用SQL获取每个cardid最大plan_arrive_time的记录
	query := `
	SELECT a.* 
	FROM allfdbus a
	INNER JOIN (
		SELECT cardid, MAX(plan_arrive_time) as max_time
		FROM allfdbus
		GROUP BY cardid
	) b ON a.cardid = b.cardid AND a.plan_arrive_time = b.max_time
	`

	allBusResult, err := g.DB().GetAll(ctx, query)
	if err != nil {
		gutil.Dump(err)
		return
	}

	if len(allBusResult) == 0 {
		return
	}

	// 转换为Fdbus结构体列表
	allBusList := gvar.New(allBusResult).Maps()
	for _, busMap := range allBusList {
		var bus Fdbus
		bus.Displanid = gvar.New(busMap["displanid"]).String()
		bus.Cardid = gvar.New(busMap["cardid"]).String()
		bus.Rundate = gvar.New(busMap["rundate"]).String()
		bus.Routename = gvar.New(busMap["routename"]).String()
		bus.Userid = gvar.New(busMap["userid"]).String()
		bus.Driver = gvar.New(busMap["driver"]).String()
		bus.Org = gvar.New(busMap["org"]).String()
		bus.Orgname = gvar.New(busMap["orgname"]).String()
		bus.Numbercode = gvar.New(busMap["numbercode"]).String()
		bus.PlanStartTime = gvar.New(busMap["plan_start_time"]).String()
		bus.PlanArriveTime = gvar.New(busMap["plan_arrive_time"]).String()
		bus.RealStartTime = gvar.New(busMap["real_start_time"]).String()
		bus.RealArriveTime = gvar.New(busMap["real_arrive_time"]).String()

		fdbus = append(fdbus, bus)
	}

	// 处理筛选后的记录
	for k, v := range fdbus {
		var TimeSet TimeSet = &fdbus[k]
		TimeSet.RundateSet(v.Rundate)
		TimeSet.PlanStartTimeSet(v.PlanStartTime)
		TimeSet.PlanArriveTimeSet(v.PlanArriveTime)
		TimeSet.RealStartTimeSet(v.RealStartTime)
		TimeSet.RealArriveTimeSet(v.RealArriveTime)
		TimeSet.NidSet(v.Rundate)
		TimeSet.WorkStatusSet("1")
	}

	// 保存数据
	if len(fdbus) > 100 {
		num := 100 //每次导入条数
		limit := math.Ceil(float64(len(fdbus)) / float64(num))
		for i := 1; i <= int(limit); i++ {
			offset := (i - 1) * num
			if num*(i+1) > len(fdbus) {
				dataPill = fdbus[offset:]
			} else {
				dataPill = fdbus[offset : num*(i+1)]
			}
			_, err := dao.FaXjxt.Ctx(ctx).OmitEmpty().Data(dataPill).Save()
			if err != nil {
				gutil.Dump(err)
			}
		}
	} else {
		_, err := dao.FaXjxt.Ctx(ctx).OmitEmpty().Data(fdbus).Save()
		if err != nil {
			gutil.Dump(err)
		}
	}
}

//func (t *UpdateSave) OperationsNow() {
//	gutil.Dump(1)
//	var fdbus []Fdbus
//	var dataPill any
//	_ = dao.Nowfdbus.Ctx(ctx).Scan(&fdbus)
//	if len(fdbus) == 0 {
//		return
//	}
//	for k, v := range fdbus {
//		var TimeSet TimeSet = &fdbus[k]
//		TimeSet.RundateSet(v.Rundate)
//		TimeSet.PlanStartTimeSet(v.PlanStartTime)
//		TimeSet.PlanArriveTimeSet(v.PlanArriveTime)
//		TimeSet.RealStartTimeSet(v.RealStartTime)
//		TimeSet.RealArriveTimeSet(v.RealArriveTime)
//		TimeSet.NidSet(v.Rundate)
//		TimeSet.WorkStatusSet("1")
//	}
//	//gutil.Dump(fdbus)
//	if len(fdbus) > 100 {
//		num := 100 //每次导入条数
//		limit := math.Ceil(float64(len(fdbus)) / float64(num))
//		for i := 1; i <= int(limit); i++ {
//			offset := (i - 1) * num
//			if num*(i+1) > len(fdbus) {
//				dataPill = fdbus[offset:]
//			} else {
//				dataPill = fdbus[offset : num*(i+1)]
//			}
//			_, _ = dao.FaXjxtcopy.Ctx(ctx).OmitEmpty().Data(dataPill).Save()
//		}
//	} else {
//		_, _ = dao.FaXjxtcopy.Ctx(ctx).OmitEmpty().Data(fdbus).Save()
//	}
//}

func (t *UpdateSave) NotOperations() {
	var fdbus []Fdbus
	var dataPill any
	_ = dao.Notfdbus.Ctx(ctx).Scan(&fdbus)
	if len(fdbus) == 0 {
		return
	}
	for k, v := range fdbus {
		var TimeSet TimeSet = &fdbus[k]
		TimeSet.RundateSet(v.Rundate)
		TimeSet.PlanStartTimeSet(v.PlanStartTime)
		TimeSet.PlanArriveTimeSet(v.PlanArriveTime)
		TimeSet.RealStartTimeSet(v.RealStartTime)
		TimeSet.RealArriveTimeSet(v.RealArriveTime)
		TimeSet.NidSet(v.Rundate)
		TimeSet.WorkStatusSet("0")
	}
	if len(fdbus) > 100 {
		num := 100 //每次导入条数
		limit := math.Ceil(float64(len(fdbus)) / float64(num))
		for i := 1; i <= int(limit); i++ {
			offset := (i - 1) * num
			if num*(i+1) > len(fdbus) {
				dataPill = fdbus[offset:]
			} else {
				dataPill = fdbus[offset : num*(i+1)]
			}
			_, _ = dao.FaXjxt.Ctx(ctx).OmitEmpty().Data(dataPill).Save()
		}
	} else {
		_, _ = dao.FaXjxt.Ctx(ctx).OmitEmpty().Data(fdbus).Save()
	}
}
